package lambda.string;

public class StringDemo {
    public static void main(String[] args) {
        String s1="123abc";
        String s2="123abc";//重用对象
        System.out.println("s1"+s1);
        System.out.println("s2"+s2);
        System.out.println(s1==s2);
        String s3="123abc";
        System.out.println("s3"+s3);
        System.out.println(s1==s3);
        //new会强制创建新对象，java不推荐这样创建字符串
        String s4=new String("123abc");
        System.out.println("s4"+s4);
        System.out.println(s1==s4);
        /*
        字符串拼接后产生的对象是不会存入常量池的
        下面代码触发了编译器的预编译特性:
        当编译器看到一个计算表达式时，如果在编译期间就可以确定结果时就会进行计算
        并将结果编译到字节码文件中，因此下面的代码会被编译器改为:
        String s5 = "123abc";
        因此s5会重用常量池对象
        */
        String s5="123"+"456";
        System.out.println(s5);
        System.out.println(s1==s5);

        String s="123";
        String s6=s+"abc";//拼接产生新对象并且不会存入常量池
        System.out.println("s6"+s6);
        System.out.println(s1==s6);
        /*
            String是不变对象，即:字符串对象创建后内容不可改变
            若改变则会创建新对象
         */
        s1=s1+"!";//此时s1不再引用常量池中的对象,而是创建了一个新的对象
        System.out.println("s1"+s1);
        System.out.println(s1==s2);//地址不在相同
        System.out.println("s2:"+s2);
        System.out.println("s3:"+s3);

    }

}
